import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Solution {
    List<Integer> t = new ArrayList<Integer>();
    List<List<Integer>> ans = new ArrayList<List<Integer>>();

    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums); // 先对数组进行排序，方便处理重复元素
        int n = nums.length;
        for (int mask = 0; mask < (1 << n); ++mask) { // 遍历所有可能的子集
            t.clear();
            boolean flag = true;
            for (int i = 0; i < n; ++i) {
                if ((mask & (1 << i)) != 0) { // 如果当前位为1，则选择该元素
                    if (i > 0 && (mask >> (i - 1) & 1) == 0 && nums[i] == nums[i - 1]) {
                        // 如果当前元素与前一个元素相同，且前一个元素未被选择，则跳过
                        flag = false;
                        break;
                    }
                    t.add(nums[i]);
                }
            }
            if (flag) {
                ans.add(new ArrayList<Integer>(t)); // 添加当前子集
            }
        }
        return ans;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] nums = {1, 2, 2};
        List<List<Integer>> result = solution.subsetsWithDup(nums);

        // 打印结果
        for (List<Integer> subset : result) {
            System.out.println(subset);
        }
    }
}